package com.hlf.modules.merchant.store.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.hlf.common.constants.ChannelConstants;
import com.hlf.common.constants.Constants;
import com.hlf.common.exception.BusinessException;
import com.hlf.common.utils.IdWorkerFactory;
import com.hlf.common.utils.MD5Util;
import com.hlf.common.utils.RESTfulSDLHttpUtils;
import com.hlf.common.utils.sdlSpd.XDLImgUtil;
import com.hlf.modules.merchant.order.service.OrderService;
import com.hlf.modules.merchant.store.constant.XdLSpdbConstants;
import com.hlf.modules.merchant.store.entity.*;
import com.hlf.modules.merchant.store.mapper.StoreMapper;
import com.hlf.modules.merchant.store.mapper.XdLInfoMapper;
import com.hlf.modules.merchant.store.service.ChannelService;
import com.hlf.modules.merchant.store.service.MerchantChannelService;
import com.hlf.modules.merchant.store.service.XdLInfoService;
import com.hlf.modules.sys.entity.File;
import com.hlf.modules.sys.entity.SysUserEntity;
import net.sf.json.JSONArray;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;


/***
 * 新大陆商户进件 返回保存
 *
 * @author Administrator
 *
 *         商户报件----------->>商户报备(微信和支付宝要分开报备)
 *         ---------->>微信公众号配置(配置支付授权目录,关联appid,推荐关注公众号)【每次接口只能传一项】 进件完就可以支付了
 *
 */
@Service
public class XdLInfoServiceImpl implements XdLInfoService {

    private static Logger logger = LoggerFactory.getLogger(XdLInfoServiceImpl.class);

    protected SysUserEntity getUser() {
        return (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
    }


    @Autowired
    private XdLInfoMapper xdlInfoMapper;
    @Autowired
    private ChannelService channelService;
    @Autowired
    private MerchantChannelService merchantChannelService;
    @Autowired
    StoreMapper storeMapper;
    @Autowired
    OrderService orderService;

    @Override
    public XdLInfo executeEport(XdLMerchantReportInfo xDlMerchantReportInfo) throws Exception {
        if (xDlMerchantReportInfo == null) {
            throw new BusinessException("对象为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStlSign())) {
            throw new BusinessException("结算标志为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStlOac())) {
            throw new BusinessException("结算账户为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getBnkAcnm())) {
            throw new BusinessException("户名为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getIcrpIdNo())) {
            throw new BusinessException("结算人身份证号为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getWcLbnkNo())) {
            throw new BusinessException("开户行 联行行号为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getBusLicNo())) {
            throw new BusinessException("营业执照号为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getBseLiceNm())) {
            throw new BusinessException("营业执照名为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getCrpNm())) {
            throw new BusinessException("法人姓名为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getMercAdds())) {
            throw new BusinessException("营业执照地址为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStoeNm())) {
            throw new BusinessException("签购单名称(门店名称)为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStoeCntNm())) {
            throw new BusinessException("联系人名称为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStoeCntTel())) {
            throw new BusinessException("联系人手机号为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStoeAreaCod())) {
            throw new BusinessException("地区码为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStoeAdds())) {
            throw new BusinessException("商户地址为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getTrmRec())) {
            throw new BusinessException("终端数量为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getMailbox())) {
            throw new BusinessException("联系人邮箱为空");
        }
        try {
            JSONObject obj = new JSONObject();
            obj.put("serviceId", "6060601");  // 1   String  7   交易码 6060601
            obj.put("stl_sign", xDlMerchantReportInfo.getStlSign().trim());  //   1   String  1   结算标志    1-对私 0-对公
            obj.put("orgNo", XdLSpdbConstants.REPORT_ORGNO);  //  //   1   String  6   机构号 合作商机构号
            obj.put("stl_oac", xDlMerchantReportInfo.getStlOac().trim());  //   // 1   String  23  结算账户    1-23 位数字
            obj.put("bnk_acnm", xDlMerchantReportInfo.getBnkAcnm().trim());  //     1   String  45  户名  2-45个字符，汉字，字母，数字
            obj.put("icrp_id_no", xDlMerchantReportInfo.getIcrpIdNo().trim());  //   0   String  18  结算人身份证号 结算标志为1-对私必输，对私：必输，18位数字对公，后台默认给法人身份证号
            obj.put("crp_exp_dt_tmp", xDlMerchantReportInfo.getCrpExpDtTmp().trim());  //   0   String  10  结算人身份证有限期   结算标志为1-对私,必输对私：输入格式 1999-12-31,对公：默认法人身份证到期日
            obj.put("wc_lbnk_no", xDlMerchantReportInfo.getWcLbnkNo().trim());  //   1   String  12  开户行 联行行号12位数字校验正确性
            obj.put("bus_lic_no", xDlMerchantReportInfo.getBusLicNo().trim());  //   1   String  27  营业执照号   长度1-27，字母，数字
            obj.put("bse_lice_nm", xDlMerchantReportInfo.getBseLiceNm().trim());  //  1   String  36  营业执照名   长度1-36，字母，数字、汉字，不能全为数字
            obj.put("crp_nm", xDlMerchantReportInfo.getCrpNm().trim());  //   1   String  10  法人姓名    2-10 汉字、数字、字母不能全为数字
            obj.put("merc_adds", xDlMerchantReportInfo.getStoeAdds().trim());  //    1   String  65  营业执照地址  格式：详细地址
            obj.put("bus_exp_dt", xDlMerchantReportInfo.getBusExpDt().trim());  //   1   String  10  营业执照有限期 格式：1999-12-31，不能小于当前日期
            obj.put("crp_id_no", xDlMerchantReportInfo.getIcrpIdNo().trim());  //    1   String  18  法人身份证   18位数字
            obj.put("crp_exp_dt", xDlMerchantReportInfo.getCrpExpDtTmp().trim());  //   1   String  10  法人身份证有效日期   格式：1999-12-31，不能小于当前日期
            obj.put("stoe_nm", xDlMerchantReportInfo.getStoeNm().trim());  //  1   String  20  签购单名称(门店名称)   8-20个数字、字母、汉字不能全为数字
            obj.put("stoe_cnt_nm", xDlMerchantReportInfo.getStoeCntNm().trim());  //  1   String  10  联系人名称   长度2-10，字母、数字、汉字不能全为数字
            obj.put("stoe_cnt_tel", xDlMerchantReportInfo.getStoeCntTel().trim());  //     1   String  11  联系人手机号  11位数字
            obj.put("mcc_cd", xDlMerchantReportInfo.getMccCd().trim());  //   1   String  4      MCC码，校验合法性
            obj.put("stoe_area_cod", xDlMerchantReportInfo.getStoeAreaCod().trim());  //    1   String  6   地区码 6位数字，校验合法性
            obj.put("stoe_adds", xDlMerchantReportInfo.getStoeAdds().trim());  //    1   String  65  商户地址    格式：详细地址
            obj.put("trm_rec", xDlMerchantReportInfo.getTrmRec().trim());  //  1   String  2   终端数量    范围在1-99
            obj.put("mailbox", xDlMerchantReportInfo.getMailbox().trim());  //  1   String  50  联系人邮箱
            obj.put("alipay_flg", "Y");  //   1   String  1   扫码产品    Y-选择 N-不选择 最少选一个产品
            obj.put("yhkpay_flg", "N");  //   1   String  1   银行卡产品
            obj.put("fee_rat_scan", "0.38");  //     0   String  精确到小数点后2位   扫码费率(%) 默认：0.38，（0.25%-3%）范围浮动（扫码支付勾选时必输）
            obj.put("fee_rat1_scan", "");  //    0   String  精确到小数点后2位   银联二维码费率(%)  银行卡和扫码都选择时候必输
            obj.put("fee_rat", "");  //  0   String  精确到小数点后2位   借记卡费率(%)    默认0.5，0.4%-3% 浮动银行卡（银行卡产品选择时必输）
            obj.put("max_fee_amt", "");  //  0   String  2   借记卡封顶（元）    默认20，最低18， 0表示不封顶（银行卡产品选择时必输）
            obj.put("fee_rat1", "");  //     0   String  精确到小数点后2位   贷记卡费率（%）    默认0.6，贷记卡0.52%-3%范围浮动（已还款产品选择时必输）
            String string1 = "";
            Collection<String> keyset = obj.keySet();
            List list = new ArrayList<>(keyset);
            Collections.sort(list);
            //这种打印出的字符串顺序和微信官网提供的字典序顺序是一致的
            for (int i = 0; i < list.size(); i++) {
                if ("crp_exp_dt_tmp".equals(list.get(i)) ||
                        "icrp_id_no".equals(list.get(i)) ||
                        "fee_rat_scan".equals(list.get(i)) ||
                     /*  "wc_lbnk_no".equals(list.get(i)) || 
                       "mcc_cd".equals(list.get(i)) || */
                        "fee_rat1_scan".equals(list.get(i)) ||
                        "fee_rat".equals(list.get(i)) ||
                        "max_fee_amt".equals(list.get(i)) ||
                        "fee_rat1".equals(list.get(i))) {
                } else {
                    string1 = string1 + obj.get(list.get(i));
                }
            }
            String do_sign = string1 + XdLSpdbConstants.SECRET_KEY;
            //md5加密 并转成小写
            String sign = MD5Util.MD5Encode(do_sign, "utf-8").toLowerCase();
            obj.put("signValue", sign);// MD5加密            
            String content = JSON.toJSONString(obj);
            String response = RESTfulSDLHttpUtils.sendPost(XdLSpdbConstants.REPORT_URL, content);
            logger.info("新大陆商户报件返回参数{}", response);
            JSONObject json = JSONObject.parseObject(response);
            String code = json.getString("msg_cd");
            // 代表进件成功
            if ("000000".equals(code)) {
                // 流水号
                String logNo = json.getString("log_no");
                // 商家识别号
                String mercId = json.getString("mercId");
                // 门店号
                String stoeId = json.getString("stoe_id");
                XdLInfo xdlInfo = new XdLInfo();
                xdlInfo.setMerchantId(xDlMerchantReportInfo.getMerchantId());
                xdlInfo.setLogNo(logNo);
                xdlInfo.setMercId(mercId);
                xdlInfo.setStoeId(stoeId);
                xdlInfoMapper.insert(xdlInfo);
                return xdlInfo;
            } else {
                logger.info("新大陆商户报件失败{}", response);
                throw new BusinessException(json.getString("msg_dat"));
            }
        } catch (Exception e) {
            logger.info("新大陆商户报件报错{}", e);
            throw new BusinessException(e.getMessage());
        }
    }

    @Override
    public XdLInfo updateEport(XdLMerchantReportInfo xDlMerchantReportInfo, XdLInfo xdLInfo) throws Exception {
        if (xDlMerchantReportInfo == null) {
            throw new BusinessException("XdLMerchantReportInfo对象为空");
        }
        if (xdLInfo == null) {
            throw new BusinessException("XdLInfo对象为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStlSign())) {
            throw new BusinessException("结算标志为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStlOac())) {
            throw new BusinessException("结算账户为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getBnkAcnm())) {
            throw new BusinessException("户名为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getIcrpIdNo())) {
            throw new BusinessException("结算人身份证号为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getWcLbnkNo())) {
            throw new BusinessException("开户行 联行行号为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getBusLicNo())) {
            throw new BusinessException("营业执照号为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getBseLiceNm())) {
            throw new BusinessException("营业执照名为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getCrpNm())) {
            throw new BusinessException("法人姓名为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getMercAdds())) {
            throw new BusinessException("营业执照地址为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStoeNm())) {
            throw new BusinessException("签购单名称(门店名称)为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStoeCntNm())) {
            throw new BusinessException("联系人名称为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStoeCntTel())) {
            throw new BusinessException("联系人手机号为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStoeAreaCod())) {
            throw new BusinessException("地区码为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getStoeAdds())) {
            throw new BusinessException("商户地址为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getTrmRec())) {
            throw new BusinessException("终端数量为空");
        }
        if (StringUtils.isEmpty(xDlMerchantReportInfo.getMailbox())) {
            throw new BusinessException("联系人邮箱为空");
        }
        try {
            JSONObject obj = new JSONObject();
            obj.put("orgNo", XdLSpdbConstants.REPORT_ORGNO);  //  //   1   String  6   机构号 合作商机构号
            obj.put("serviceId", "6060604");
            obj.put("stoe_id", xdLInfo.getStoeId());
            obj.put("version", "V1.0.1");
            obj.put("mercAdds", xDlMerchantReportInfo.getStoeAdds().trim());
            obj.put("log_no", xdLInfo.getLogNo()); //1 String Max(8) 设备号 长度8位数字，进件生成终端号
            obj.put("mercId", xdLInfo.getMercId()); //1 String Max(8) 设备号 长度8位数字，进件生成终端号
            obj.put("stl_sign", xDlMerchantReportInfo.getStlSign().trim());  //   1   String  1   结算标志    1-对私 0-对公
            obj.put("stl_oac", xDlMerchantReportInfo.getStlOac().trim());  //   // 1   String  23  结算账户    1-23 位数字
            obj.put("bnk_acnm", xDlMerchantReportInfo.getBnkAcnm().trim());  //     1   String  45  户名  2-45个字符，汉字，字母，数字
            obj.put("icrp_id_no", xDlMerchantReportInfo.getIcrpIdNo().trim());  //   0   String  18  结算人身份证号 结算标志为1-对私必输，对私：必输，18位数字对公，后台默认给法人身份证号
            obj.put("crp_exp_dt_tmp", xDlMerchantReportInfo.getCrpExpDtTmp().trim());  //   0   String  10  结算人身份证有限期   结算标志为1-对私,必输对私：输入格式 1999-12-31,对公：默认法人身份证到期日
            obj.put("wc_lbnk_no", xDlMerchantReportInfo.getWcLbnkNo().trim());  //   1   String  12  开户行 联行行号12位数字校验正确性
            obj.put("bus_lic_no", xDlMerchantReportInfo.getBusLicNo().trim());  //   1   String  27  营业执照号   长度1-27，字母，数字
            obj.put("bse_lice_nm", xDlMerchantReportInfo.getBseLiceNm().trim());  //  1   String  36  营业执照名   长度1-36，字母，数字、汉字，不能全为数字
            obj.put("crp_nm", xDlMerchantReportInfo.getCrpNm().trim());  //   1   String  10  法人姓名    2-10 汉字、数字、字母不能全为数字
            obj.put("bus_exp_dt", xDlMerchantReportInfo.getBusExpDt().trim());  //   1   String  10  营业执照有限期 格式：1999-12-31，不能小于当前日期
            obj.put("crp_id_no", xDlMerchantReportInfo.getIcrpIdNo().trim());  //    1   String  18  法人身份证   18位数字
            obj.put("crp_exp_dt", xDlMerchantReportInfo.getCrpExpDtTmp().trim());  //   1   String  10  法人身份证有效日期   格式：1999-12-31，不能小于当前日期
            obj.put("stoe_nm", xDlMerchantReportInfo.getStoeNm().trim());  //  1   String  20  签购单名称(门店名称)   8-20个数字、字母、汉字不能全为数字
            obj.put("stoe_cnt_nm", xDlMerchantReportInfo.getStoeCntNm().trim());  //  1   String  10  联系人名称   长度2-10，字母、数字、汉字不能全为数字
            obj.put("stoe_cnt_tel", xDlMerchantReportInfo.getStoeCntTel().trim());  //     1   String  11  联系人手机号  11位数字
            obj.put("mcc_cd", xDlMerchantReportInfo.getMccCd().trim());  //   1   String  4      MCC码，校验合法性
            obj.put("stoe_area_cod", xDlMerchantReportInfo.getStoeAreaCod().trim());  //    1   String  6   地区码 6位数字，校验合法性
            obj.put("stoe_adds", xDlMerchantReportInfo.getStoeAdds().trim());  //    1   String  65  商户地址    格式：详细地址
            obj.put("trm_rec", xDlMerchantReportInfo.getTrmRec().trim());  //  1   String  2   终端数量    范围在1-99
            obj.put("mailbox", xDlMerchantReportInfo.getMailbox().trim());  //  1   String  50  联系人邮箱
            obj.put("alipay_flg", "Y");  //   1   String  1   扫码产品    Y-选择 N-不选择 最少选一个产品
            obj.put("yhkpay_flg", "N");  //   1   String  1   银行卡产品
            obj.put("fee_rat_scan", "0.38");  //     0   String  精确到小数点后2位   扫码费率(%) 默认：0.38，（0.25%-3%）范围浮动（扫码支付勾选时必输）
            obj.put("fee_rat1_scan", "");  //    0   String  精确到小数点后2位   银联二维码费率(%)  银行卡和扫码都选择时候必输
            obj.put("fee_rat", "");  //  0   String  精确到小数点后2位   借记卡费率(%)    默认0.5，0.4%-3% 浮动银行卡（银行卡产品选择时必输）
            obj.put("max_fee_amt", "");  //  0   String  2   借记卡封顶（元）    默认20，最低18， 0表示不封顶（银行卡产品选择时必输）
            obj.put("fee_rat1", "");  //     0   String  精确到小数点后2位   贷记卡费率（%）    默认0.6，贷记卡0.52%-3%范围浮动（已还款产品选择时必输）
            String string1 = "";
            Collection<String> keyset = obj.keySet();
            List list = new ArrayList<>(keyset);
            Collections.sort(list);
            //这种打印出的字符串顺序和微信官网提供的字典序顺序是一致的
            for (int i = 0; i < list.size(); i++) {
                if ("crp_exp_dt_tmp".equals(list.get(i)) ||
                        "icrp_id_no".equals(list.get(i)) ||
                        "fee_rat_scan".equals(list.get(i)) ||
                        "fee_rat1_scan".equals(list.get(i)) ||
                        "fee_rat".equals(list.get(i)) ||
                        "max_fee_amt".equals(list.get(i)) ||
                        "fee_rat2_scan".equals(list.get(i)) ||
                        "cardTyp".equals(list.get(i)) ||
                        "suptDbfreeFlg".equals(list.get(i)) ||
                        "tranTyps".equals(list.get(i)) ||
                        "scan_stoe_cnm".equals(list.get(i)) ||
                        "fee_rat1".equals(list.get(i))) {
                } else {
                    string1 = string1 + obj.get(list.get(i));
                }
            }
            String do_sign = string1 + XdLSpdbConstants.SECRET_KEY;
            //md5加密 并转成小写
            String sign = MD5Util.MD5Encode(do_sign, "utf-8").toLowerCase();
            obj.put("signValue", sign);// MD5加密
            String content = JSON.toJSONString(obj);
            String response = RESTfulSDLHttpUtils.sendPost(XdLSpdbConstants.REPORT_URL, content);
            logger.info("新大陆商户报件返回参数{}", response);
            JSONObject json = JSONObject.parseObject(response);
            String code = json.getString("msg_cd");
            // 代表进件成功
            if ("000000".equals(code)) {
                // 流水号
                String logNo = json.getString("log_no");
                // 商家识别号
                String mercId = json.getString("mercId");
                XdLInfo xdlInfo = new XdLInfo();
                xdlInfo.setMerchantId(xDlMerchantReportInfo.getMerchantId());
                xdlInfo.setLogNo(logNo);
                xdlInfo.setMercId(mercId);
                xdlInfoMapper.updateByPrimaryKeySelective(xdlInfo);
                return xdlInfo;
            } else {
                logger.info("新大陆商户报件失败{}", response);
                throw new BusinessException(json.getString("msg_dat"));
            }
        } catch (Exception e) {
            logger.info("新大陆商户报件报错{}", e);
            throw new BusinessException(e.getMessage());
        }
    }

    @Override
    public Map<String, Object> findCodeNname(String provNm, String city_nm) {
        Map<String, Object> result = Maps.newHashMap();
        if ("请选择".equals(provNm)) {
            provNm = "";
        }
        if ("请选择".equals(city_nm)) {
            city_nm = "";
        }
        JSONObject obj = new JSONObject();
        obj.put("serviceId", "6060206");  // 1   String  7   交易码 6060601
        obj.put("prov_nm", provNm);
        obj.put("city_nm", city_nm);
        obj.put("orgNo", XdLSpdbConstants.REPORT_ORGNO);  //  //   1   String  6   机构号 合作商机构号
        String string1 = "";
        Collection<String> keyset = obj.keySet();
        List list = new ArrayList<String>(keyset);
        Collections.sort(list);
        //这种打印出的字符串顺序和微信官网提供的字典序顺序是一致的
        for (int i = 0; i < list.size(); i++) {
            if ("prov_nm".equals(list.get(i)) ||
                    "city_nm".equals(list.get(i))) {
            } else {
                string1 = string1 + obj.get(list.get(i));
            }
        }
        String do_sign = string1 + XdLSpdbConstants.SECRET_KEY;
        //md5加密 并转成小写
        String sign = MD5Util.MD5Encode(do_sign, "utf-8").toLowerCase(); //
        obj.put("signValue", sign);// MD5加密
            /*logger.info("查询省市区参数{}", obj);*/
        String content = obj.toString();
        String returnstr = RESTfulSDLHttpUtils.sendPost(XdLSpdbConstants.REPORT_URL, content);
        JSONObject json = JSON.parseObject(returnstr);
        String code = json.getString("msg_cd");
        if ("000000".equals(code)) {
            String jsonMessage = json.getString("REC");
            JSONArray jsonArray = JSONArray.fromObject(jsonMessage);
            Set<Object> provSet = new HashSet<Object>();
            Set<Object> citySet = new HashSet<Object>();
            Set<Object> areaSet = new HashSet<Object>();
            if (json.size() > 0) {
                for (int i = 0; i < jsonArray.size(); i++) {
                    List<Object> provList = new ArrayList<Object>();
                    List<Object> cityList = new ArrayList<Object>();
                    List<Object> areaList = new ArrayList<Object>();
                    net.sf.json.JSONObject job = jsonArray.getJSONObject(i);  // 遍历 jsonarray 数组，把每一个对象转成 json 对象
                    provList.add(job.get("prov_nm"));
                    provList.add(job.get("merc_prov"));
                    cityList.add(job.get("city_nm"));
                    cityList.add(job.get("merc_city"));
                    areaList.add(job.get("area_nm"));
                    areaList.add(job.get("merc_area"));
                    provSet.add(provList);
                    citySet.add(cityList);
                    areaSet.add(areaList);
                }
            }
            result.put("province", provSet);
            result.put("city", citySet);
            result.put("district", areaSet);
        } else {
            throw new BusinessException(json.getString("msg_dat"));
        }
        return result;
    }


    /**
     * 商家进件图片上传
     */
    @Override
    public String uploadImage(XdLInfo xdLInfo, XdLMerchantReportInfo xdlMercInfo) throws Exception {

        List<File> businessImg = xdlMercInfo.getBusinessImg();
        List<File> bankCardImg = xdlMercInfo.getBankCardImg();
        List<File> identityCardImg = xdlMercInfo.getIdentityCardImg();
        List<File> openLicenseImg = xdlMercInfo.getOpenLicenseImg();
        List<File> storeSignImg = xdlMercInfo.getStoreSignImg();
        //上传门店营业执照
        for (File file : businessImg) {
            if (file != null) {
                String bizImgpath = file.getFilSerPath();
                XDLImgUtil.upLoadImg(xdLInfo, bizImgpath, "1", file.getFilSerName());
            }
        }
        //门店照
        for (File file : storeSignImg) {
            if (file != null) {
                String storeImgpath = file.getFilSerPath();
                XDLImgUtil.upLoadImg(xdLInfo, storeImgpath, "6", file.getFilSerName());
            }
        }
        //银行卡照
        for (File file : bankCardImg) {
            if (file != null) {
                String bankImgpath = file.getFilSerPath();
                XDLImgUtil.upLoadImg(xdLInfo, bankImgpath, "11", file.getFilSerName());
            }
        }
        //身份证照
        for (File file : identityCardImg) {
            if (file != null) {
                String identityImgpath = file.getFilSerPath();
                XDLImgUtil.upLoadImg(xdLInfo, identityImgpath, "9", file.getFilSerName());
            }
        }
        //开户许可证照
        if ("0".equals(xdlMercInfo.getStlSign())) {
            for (File file : openLicenseImg) {
                if (file != null) {
                    String openImgpath = file.getFilSerPath();
                    XDLImgUtil.upLoadImg(xdLInfo, openImgpath, "12", file.getFilSerName());
                }
            }
        }

        XdLInfo XdLInfo = new XdLInfo();
        XdLInfo.setMerchantId(xdLInfo.getMerchantId());
        XdLInfo.setMerchantImg("img");
        xdlInfoMapper.updateByPrimaryKeySelective(XdLInfo);
        return Constants.DEFAULT_MSG_SUCCESS;
    }

    /**
     * 商家提交
     */
    @Override
    public String merchantSubmit(XdLInfo xdLInfo) {
        JSONObject obj = new JSONObject();
        obj.put("orgNo", XdLSpdbConstants.REPORT_ORGNO);  //  //   1   String  6   机构号 合作商机构号
        obj.put("serviceId", "6060603"); // 1 String Max(15) 商户号
        obj.put("log_no", xdLInfo.getLogNo()); //1 String Max(8) 设备号 长度8位数字，进件生成终端号
        obj.put("mercId", xdLInfo.getMercId()); //1 String Max(8) 设备号 长度8位数字，进件生成终端号
        String string1 = "";
        Collection<String> keyset = obj.keySet();
        List list = new ArrayList<String>(keyset);
        Collections.sort(list);
        //这种打印出的字符串顺序和微信官网提供的字典序顺序是一致的
        for (int i = 0; i < list.size(); i++) {
            string1 = string1 + obj.get(list.get(i));
        }
        String do_sign = string1 + XdLSpdbConstants.SECRET_KEY;
        //md5加密 并转成小写
        String sign = MD5Util.MD5Encode(do_sign, "utf-8").toLowerCase(); //
        obj.put("signValue", sign);// MD5加密
        String content = JSON.toJSONString(obj);
        String response = RESTfulSDLHttpUtils.sendPost(XdLSpdbConstants.REPORT_URL, content);
        JSONObject jsons = JSON.parseObject(response);
        String codes = jsons.getString("msg_cd");
        if ("000000".equals(codes)) {
            String checkFlag = jsons.getString("check_flag");
            logger.info("新大陆商家进件审核状态{}", checkFlag);
            Store store = new Store();
            store.setId(xdLInfo.getMerchantId());
            XdLInfo xdlInfo = new XdLInfo();
            if ("1".equals(checkFlag)) {
                String reString = jsons.getString("key");
                if (StringUtils.isNotBlank(reString)) {
                    xdlInfo.setMerchantId(xdLInfo.getMerchantId());
                    xdlInfo.setKey(reString);
                    String rec = jsons.getString("REC");
                    JSONArray jsonArray = JSONArray.fromObject(rec);
                    for (int i = 0; i < jsonArray.size(); i++) {
                        net.sf.json.JSONObject j = jsonArray.getJSONObject(i);
                        String trmNo = j.getString("trmNo");
                        xdlInfo.setTrmNo(trmNo);
                    }
                    logger.info("新大陆商家秘钥{}", reString);
                }
                store.setAuditStatus(Constants.AUDIT_STATUS_PASS);
            } else if ("2".equals(checkFlag) || "3".equals(checkFlag)) {
                String msg = jsons.getString("chek_msg");
                if ("2".equals(checkFlag)) {
                    store.setAuditStatus(Constants.AUDIT_STATUS_NO_PASS);
                } else {
                    store.setAuditStatus(Constants.AUDIT_STATUS_REVIEW);
                }
                store.setRemarks(msg);
            }
            xdlInfo.setMerchantInfo("info");
            xdlInfoMapper.updateByPrimaryKeySelective(xdlInfo);
            storeMapper.updateByPrimaryKeySelective(store);
        } else {
            String msg_dat = jsons.getString("msg_dat");
            throw new BusinessException(msg_dat);
        }
        return Constants.DEFAULT_MSG_SUCCESS;
    }

    @Override
    public String reportInsert(XdLInfo xdLInfo) {
        MerchantChannel merchantChannel = new MerchantChannel();
        Channel channel = channelService.selectByCode(ChannelConstants.PAY_CHANNEL_XDLSPD);
        if (channel != null) {
            merchantChannel.setChannelId(String.valueOf(channel.getId()));
        }
        /*xdlInfoMapper.insert(xdLInfo); */
        //保存进件渠道信息
        merchantChannel.setId(IdWorkerFactory.nextId());
        merchantChannel.setMerchantId(String.valueOf(xdLInfo.getMerchantId()));
        merchantChannel.setMerhcantNo(xdLInfo.getMercId());
        merchantChannel.setDelFlag(1);
        merchantChannelService.insert(merchantChannel);
        // 支付宝商户号
        Store store = new Store();
        store.setId(xdLInfo.getMerchantId());
        store.setSync((byte) 1);
        storeMapper.updateByPrimaryKeySelective(store);
        return Constants.DEFAULT_MSG_SUCCESS;
    }

    @Override
    public XdLInfo selectByPrimaryKey(Long merchantId) {
        // TODO Auto-generated method stub
        return xdlInfoMapper.selectByPrimaryKey(merchantId);
    }

    @Override
    public void getSaveStatus(XdLInfo spd) {
        JSONObject obj = new JSONObject();
        obj.put("orgNo", XdLSpdbConstants.REPORT_ORGNO);  //  //   1   String  6   机构号 合作商机构号
        obj.put("serviceId", "6060300"); // 1 String Max(15) 商户号
        obj.put("mercId", spd.getMercId()); //1 String Max(8) 设备号 长度8位数字，进件生成终端号
        String string1 = "";
        Collection<String> keyset = obj.keySet();
        List list = new ArrayList<>(keyset);
        Collections.sort(list);
        //这种打印出的字符串顺序和微信官网提供的字典序顺序是一致的
        for (int i = 0; i < list.size(); i++) {
            string1 = string1 + obj.get(list.get(i));
        }
        String do_sign = string1 + XdLSpdbConstants.SECRET_KEY;
        //md5加密 并转成小写
        String sign = MD5Util.MD5Encode(do_sign, "utf-8").toLowerCase(); //
        obj.put("signValue", sign);// MD5加密
        String content = JSON.toJSONString(obj);
        String response = RESTfulSDLHttpUtils.sendPost(XdLSpdbConstants.REPORT_URL, content);
        JSONObject jsons = JSON.parseObject(response);
        String codes = jsons.getString("msg_cd");
        String msg_dat = jsons.getString("msg_dat");
        Store store = new Store();
        store.setId(spd.getMerchantId());
        if ("000000".equals(codes)) {
            String checkFlag = jsons.getString("check_flag");
            logger.info("新大陆商家进件审核状态{}", checkFlag);
            if ("1".equals(checkFlag)) {
                String reString = jsons.getString("key");
                if (StringUtils.isNotBlank(reString)) {
                    XdLInfo xdLInfo = new XdLInfo();
                    xdLInfo.setMerchantId(xdLInfo.getMerchantId());
                    xdLInfo.setKey(reString);
                    String rec = jsons.getString("REC");
                    JSONArray jsonArray = JSONArray.fromObject(rec);
                    for (int i = 0; i < jsonArray.size(); i++) {
                        net.sf.json.JSONObject j = jsonArray.getJSONObject(i);
                        String trmNo = j.getString("trmNo");
                        xdLInfo.setTrmNo(trmNo);
                    }
                    xdLInfo.setMerchantInfo("info");
                    xdlInfoMapper.updateByPrimaryKeySelective(xdLInfo);
                    logger.info("新大陆商家秘钥{}", reString);
                }
                store.setAuditStatus(Constants.AUDIT_STATUS_PASS);
            } else if ("2".equals(checkFlag)) {
                store.setAuditStatus(Constants.AUDIT_STATUS_NO_PASS);
            } else if ("3".equals(checkFlag)) {
                store.setAuditStatus(Constants.AUDIT_STATUS_REVIEW);
            }
            storeMapper.updateByPrimaryKeySelective(store);
        }
    }
}
